Web Development Redux State Immutable রাখার উপায় গাইড ও নোট

177

Redux একটি স্টেট ম্যানেজমেন্ট লাইব্রেরি, যেখানে স্টেট পরিবর্তন করার জন্য বিশেষভাবে লক্ষ্য রাখা হয় যেন স্টেট অপরিবর্তনীয় (immutable) থাকে। স্টেট যদি পরিবর্তনশীল (mutable) হয়, তাহলে অ্যাপ্লিকেশনটি অপ্রত্যাশিতভাবে আচরণ করতে পারে এবং ডিবাগিং কঠিন হয়ে পড়ে। Redux-এ স্টেটকে অপরিবর্তনীয় রাখতে হলে কিছু নির্দিষ্ট নিয়ম এবং কৌশল অনুসরণ করতে হয়, যা অ্যাপ্লিকেশনের পূর্বানুমানযোগ্যতা এবং স্থায়ীত্ব বজায় রাখতে সহায়তা করে।


Redux-এ Immutable স্টেট রাখার প্রয়োজনীয়তা

  1. একক স্টেট কপি (Single Source of Truth): Redux-এ একটি একক স্টেট কপি থাকে, এবং সেই স্টেটটি সব সময় অপরিবর্তনীয় হওয়া উচিত। যদি স্টেট পরিবর্তনশীল হয়, তাহলে বিভিন্ন অংশে স্টেটের মান অপ্রত্যাশিতভাবে পরিবর্তিত হতে পারে।
  2. ডিবাগিং সহজ করা: যখন স্টেট অপরিবর্তনীয় থাকে, তখন অ্যাপ্লিকেশনের আচরণ পূর্বানুমানযোগ্য হয় এবং সমস্যা খুঁজে বের করা সহজ হয়।
  3. বিষয়ভিত্তিক সাবস্ক্রিপশন: যখন স্টেট অপরিবর্তনীয় থাকে, তখন সাবস্ক্রাইবাররা কেবলমাত্র পরিবর্তিত অংশে নতুন স্টেট দেখতে পান, যা পারফরম্যান্স এবং রেন্ডারিং উন্নত করে।
  4. টেস্টিং: অপরিবর্তনীয় স্টেট টেস্টিংয়ের জন্য সহজ, কারণ আমরা জানি যে স্টেট কখনও সরাসরি পরিবর্তন হবে না।

Redux-এ Immutable স্টেট রাখার উপায়

Redux-এ স্টেট অপরিবর্তনীয় (immutable) রাখতে কিছু বিশেষ কৌশল অবলম্বন করতে হয়, কারণ JavaScript অবজেক্ট এবং অ্যারে ডিফল্টভাবে পরিবর্তনযোগ্য (mutable) থাকে। এখানে কিছু সাধারণ উপায় তুলে ধরা হলো:


১. স্টেটের নতুন কপি তৈরি করা (Creating a New State Copy)

Redux-এ স্টেট কখনো সরাসরি পরিবর্তন করা হয় না। রিডিউসারের ভিতরে, আপনাকে প্রতিবার একটি নতুন স্টেট কপি তৈরি করতে হবে যখনই স্টেট পরিবর্তন করতে হবে। concat(), map(), filter() বা স্প্রেড অপারেটর (...) এর মতো ইমিউটেবল অপারেশন ব্যবহার করা যেতে পারে।

উদাহরণ:

function todosReducer(state = [], action) {
  switch (action.type) {
    case 'ADD_TODO':
      // স্টেটের একটি নতুন কপি তৈরি করা
      return [...state, action.payload];
    case 'REMOVE_TODO':
      // একটি আইটেম সরানোর জন্য নতুন কপি তৈরি করা
      return state.filter(todo => todo.id !== action.payload.id);
    default:
      return state;
  }
}

এখানে:

  • [...] স্প্রেড অপারেটর ব্যবহার করে পুরানো স্টেট থেকে একটি নতুন অ্যারে তৈরি করা হয়েছে, যাতে কোনো মৌলিক পরিবর্তন না হয়।
  • filter() পদ্ধতি ব্যবহার করে স্টেট থেকে একটি আইটেম সরানো হয়েছে, এবং নতুন অ্যারে রিটার্ন করা হয়েছে।

২. Object.assign() ব্যবহার করা

JavaScript-এর Object.assign() ফাংশন একটি অবজেক্টের সমস্ত প্রপার্টি অন্য একটি অবজেক্টে কপি করে, যেটি নতুন অবজেক্টে পরিবর্তন আনে, কিন্তু মূল অবজেক্টে কোনো পরিবর্তন হয় না। আপনি যদি স্টেটের কোনো অবজেক্ট পরিবর্তন করতে চান, তবে Object.assign() ব্যবহার করতে পারেন।

উদাহরণ:

function counterReducer(state = { count: 0 }, action) {
  switch (action.type) {
    case 'INCREMENT':
      return Object.assign({}, state, { count: state.count + 1 });
    case 'DECREMENT':
      return Object.assign({}, state, { count: state.count - 1 });
    default:
      return state;
  }
}

এখানে, Object.assign({}, state, { count: state.count + 1 }) দিয়ে একটি নতুন অবজেক্ট তৈরি করা হচ্ছে, যা পুরোনো স্টেটের কপি, তবে count প্রপার্টি পরিবর্তিত হয়েছে।


৩. স্প্রেড অপারেটর (Spread Operator) ব্যবহার করা

JavaScript-এ স্প্রেড অপারেটর (...) ব্যবহার করলে, আপনি একটি অবজেক্ট বা অ্যারে কপি করতে পারেন, যা অপরিবর্তনীয় স্টেট রাখার জন্য খুবই কার্যকরী। এটি অনেক সহজ এবং পরিষ্কার পদ্ধতি।

উদাহরণ:

function counterReducer(state = { count: 0 }, action) {
  switch (action.type) {
    case 'INCREMENT':
      return { ...state, count: state.count + 1 };
    case 'DECREMENT':
      return { ...state, count: state.count - 1 };
    default:
      return state;
  }
}

এখানে:

  • { ...state, count: state.count + 1 } এর মাধ্যমে পুরানো স্টেটের কপি তৈরি হচ্ছে এবং কেবল count প্রপার্টি পরিবর্তিত হচ্ছে।

৪. Immutable.js ব্যবহার করা

Immutable.js একটি লাইব্রেরি যা JavaScript-এ ইমিউটেবল ডেটা স্ট্রাকচার সরবরাহ করে। এটি অ্যারে, অবজেক্ট, মেপ, সেট ইত্যাদি পরিবর্তনশীল ডেটা স্ট্রাকচারকে অপরিবর্তনীয় (immutable) করে তোলে। Redux-এ ইমিউটেবল স্টেট ম্যানেজমেন্টের জন্য আপনি Immutable.js ব্যবহার করতে পারেন।

উদাহরণ:

import { Map } from 'immutable';

function counterReducer(state = Map({ count: 0 }), action) {
  switch (action.type) {
    case 'INCREMENT':
      return state.update('count', count => count + 1);
    case 'DECREMENT':
      return state.update('count', count => count - 1);
    default:
      return state;
  }
}

এখানে, state.update('count', count => count + 1) ব্যবহার করে স্টেটের count প্রপার্টি পরিবর্তন করা হচ্ছে, কিন্তু পুরানো স্টেট অপরিবর্তনীয় রাখা হচ্ছে।


৫. Redux Toolkit ব্যবহার করা

Redux Toolkit Redux-এ স্টেট ম্যানেজমেন্টের জন্য আধুনিক এবং সহজ উপায়। Redux Toolkit এর মধ্যে কিছু ইমিউটেবল ফিচার রয়েছে, যেমন createSlice, যা ইমিউটেবল স্টেট ম্যানেজমেন্টকে আরও সহজ করে তোলে।

উদাহরণ:

import { createSlice } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: { count: 0 },
  reducers: {
    increment: state => {
      state.count += 1; // এখানে Redux Toolkit স্বয়ংক্রিয়ভাবে ইমিউটেবল রিয়্যাকশন পরিচালনা করে
    },
    decrement: state => {
      state.count -= 1;
    }
  }
});

export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;

এখানে, Redux Toolkit ব্যবহার করলে, আমরা সরাসরি স্টেট পরিবর্তন করতে পারি, তবে এটি বাইরেরভাবে স্টেটকে অপরিবর্তনীয় রাখে।


সারাংশ

Redux-এ স্টেটকে অপরিবর্তনীয় (immutable) রাখা গুরুত্বপূর্ণ, কারণ এটি অ্যাপ্লিকেশনের আচরণ পূর্বানুমানযোগ্য এবং সহজে ডিবাগযোগ্য করে তোলে। স্টেটকে ইমিউটেবল রাখার জন্য কিছু কৌশল ব্যবহার করা হয়:

  • নতুন কপি তৈরি করা (স্প্রেড অপারেটর বা Object.assign() ব্যবহার করে),
  • Immutable.js ব্যবহার করা,
  • Redux Toolkit ব্যবহার করা, যা ইমিউটেবল স্টেট পরিচালনা করতে সাহায্য করে।

এই পদ্ধতিগুলির মাধ্যমে Redux অ্যাপ্লিকেশনটির স্টেট ম্যানেজমেন্ট আরও কার্যকর এবং স্থিতিশীল হয়।

Content added By
Promotion

Are you sure to start over?

Loading...